package com.day06;

/**
 * 测试类
 *
 * 创建类的对象 = 类的实例化 = 实例化类
 *
 * 二.类和对象的使用(面向对象思想落地的实现)
 *
 *  1.创建类,设计类的成员
 *  2.创建类的对象
 *  3.通过对象.属性或对象.方法的形式调用对象的结构
 *
 *三.创建了一个类的多个对象，则每个对象都独立的拥有一套类的属性(非static的属性)
 * 意味着，如果我们修改一个对象的属性a,则不影响另外一个对象属性a的值
 *
 *
 * 四.对象的内存解析
 *  堆(Heap)：此内存区域唯一的目的就是存放对象实例，几乎所有的对象实例都在这里分配内存。这一点在java虚拟机规范中的描述是:
 *  所有的对象实例以及数组都要在堆上分配。
 *
 *  栈(stack):是指虚拟机栈，虚拟机栈用于存放局部变量等。局部变量表存放了编译期可知长度的各种基本数据类型(boolean,byte,char,short,int,float,long,double)
 *  对象引用(reference类型，它不等同于对象本身，是对象在堆内存的首地址)。方法执行完，自动释放。
 *
 *  方法区(Method Area)，用于存储已被虚拟机加载的类信息，常量，静态变量，即时编译器编译后的代码等数据。
 *
 * @author 薛虎*/
public class PersonTest {
    public static void main(String[] args) {
        //创建Person类的对象
        Person person = new Person();
        //Scanner scanner = new Scaaner();

        //调用对象的结构：属性和方法
        //调用属性 对象.属性
        person.name = "Tom";
        person.isMale = true;
        System.out.println(person.name);

        //调用方法"对象.方法"
        person.eat();
        person.sleep();
        person.talk("Chinese");


        //*********************
        //array2 = array1
        Person p2 = new Person();
        p2.eat();
        p2.talk("xuehu");
        p2.sleep();
        //null
        System.out.println(p2.name);

        //将p1变量保存的对象地址值赋给p3,导致p1和p3指向了堆空间中的同一个对象实体
        Person p3 = person;
        System.out.println(p3.name);

        p3.age = 10;
        System.out.println(person.age);
    }

}
